<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=gbk"%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html"; charset="gbk">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
<script type="text/javascript" src="http://www.ip-look-up.com/Services/ipInfo.js"></script> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script> 
<script src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/routeboxer/src/RouteBoxer.js" type="text/javascript"></script> 


<SCRIPT language=JScript event=OnObjectReady(objObject,objAsyncContext) for=foo> 
   if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true) 
   { 
    if(objObject.MACAddress != null && objObject.MACAddress != "undefined") 
    MACAddr = objObject.MACAddress; 
    if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined") 
    IPAddr = objObject.IPAddress(0); 
    if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined") 
    sDNSName = objObject.DNSHostName; 
    } 
</SCRIPT> 

<script type="text/javascript"> 
var geocoder; //定义一个Geocoder对象 
var map;        //定义一个Map对象 
var infowindow = new google.maps.InfoWindow();    //初始化一个信息窗口，用来显示提示信息 

//定义导航组件 
var boxpolys = null;        //保存路线的数组 
//var directions = null; 
var routeBoxer = null;    //RouteBoxer对象 
var distance = null; // km 



    //初始化一个最简单的地图 
function initialize() { 
      //创建Geocoder对象，该对象是实现地址和经纬度的转换 
    geocoder = new google.maps.Geocoder(); 
    //实例化LatLng，LatLng是标注经纬度的对象，用它来控制地图中心显示的坐标 
    //纬度介于-90 度和+90度，经度将被介于-180度和180度 
    //ipLocation.latitude, ipLocation.longitude 外部插件根据ip获取经纬度 .
	//26.709733, 113.269576城关镇
	var latlng = new google.maps.LatLng(26.709458,113.26705); 
   if (geocoder) { 
      geocoder.geocode({'latLng': latlng}, function(results, status) {    //根据经纬度查找地理位置 
        if (status == google.maps.GeocoderStatus.OK) {    //判断查找状态 
                marker = new google.maps.Marker({    //添加标记 
                position: latlng, 
                map: map 
            }); 
            /* 
                InfoWindow 信息窗口类。显示标记位置的信息 
            */ 
            infowindow.setContent('郴州安仁大市场<br><p>浪鲸卫浴</p>');     //设置信息的内容 
            infowindow.open(map, marker);    //打开信息窗口。一般与map和标记关联 
           } else { 
          alert("Geocoder failed due to: " + status); 
        } 
      }); 
    } 
    //定义MapOptions对象属性 
    var myOptions = { 
      zoom: 14,            //地图缩放级别 
      center: latlng,    //中心点坐标 
      mapTypeId: google.maps.MapTypeId.ROADMAP,    //地图显示的类型。有地图(ROADMAP)、卫星(SATELLITE)、混合(HYBRID)、地形(TERRAIN)四种类型 
      disableDoubleClickZoom:true 
      //还有其它属性见api中 
    } 
    //创建地图。构造器中有两个参数。第一个参数是显示层div的对象。第二个参数是myOptions 
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
    codeEvent();    //调用下面定义的事件处理 
   
    //导航组件初始化 
    routeBoxer = new RouteBoxer(); 
    directionService = new google.maps.DirectionsService(); 
    directionsRenderer = new google.maps.DirectionsRenderer({ map: map }); 
   
} 

//根据地址查找。并且查找的结果显示在中心并且标记 
function codeAddress() { 
    var address = document.getElementById("address").value; 
    if (geocoder) { 
        /*Geocoder只有一个方法geocode 
        第一个参数: GeocoderRequest，有五个可配置参数address、bounds、language、location、region 
        第二个参数：回调方法（GeocoderResult对象[数组]，GeocoderStatus对象） 
        GeocoderResult：以json格式表示的geocode结果集，有三个属性{ 
            address_components：GeocoderAddressComponent对象的数组 
            geometry：GeocoderGeometry 对象 { 
                    bounds：LatLngBounds 对象 
                    location：LatLng 对象 
                    location_type：GeocoderLocationType 对象 
                    viewport：       LatLngBounds 对象 
                } 
            types：一个字符串的数组，为一个地理位置的唯一标示 
        } 
        GeocoderStatus 定义了geocode()返回的7个状态 
        */ 
      geocoder.geocode( { 'address': address}, function(results, status) { 
        if (status == google.maps.GeocoderStatus.OK) { 
            //results[0].geometry.location 根据上面的注释可以知道 这里是通过搜索地址来获得经纬度 
          map.setCenter(results[0].geometry.location); 
          /* 
                  Marker类：给地图显示标记。参数为 MarkerOptions。共有12个属性。其中position属性为必须配置的。 
          */ 
          var marker = new google.maps.Marker({ 
              map: map,                                 //定义在map中显示标记。 
              position: results[0].geometry.location    //定义标记的位置 
          }); 
           infowindow.setContent(address);     //设置信息的内容 
           infowindow.open(map, marker);    //打开信息窗口。一般与map和标记关联 
        } else { 
          alert("Geocode was not successful for the following reason: " + status); 
        } 
      }); 
    } 
} 


//根据经纬度查找中心点。并且显示中心点的信息 
function codeLatLng() { 
    //var input = document.getElementById("latlng").value; 
    /*对经纬度进行处理*/ 
    var input = "28.19,112.98"; 
    var latlngStr = input.split(",",2); 
    var lat = parseFloat(latlngStr[0]); 
    var lng = parseFloat(latlngStr[1]); 
    var latlng = new google.maps.LatLng(lat, lng);    //根据经纬度创建LatLng 
    if (geocoder) { 
      geocoder.geocode({'latLng': latlng}, function(results, status) {    //根据经纬度查找地理位置 
        if (status == google.maps.GeocoderStatus.OK) {    //判断查找状态 
          if (results[1]) {                                //查找成功 
            map.setZoom(11);    //设置zoom 
            marker = new google.maps.Marker({    //添加标记 
                position: latlng, 
                map: map 
            }); 
            /* 
                InfoWindow 信息窗口类。显示标记位置的信息 
            */ 
            infowindow.setContent(results[1].formatted_address);     //设置信息的内容 
            infowindow.open(map, marker);    //打开信息窗口。一般与map和标记关联 
          } 
        } else { 
          alert("Geocoder failed due to: " + status); 
        } 
      }); 
    } 
} 




//事件处理 
function codeEvent() { 
    //双击 
    google.maps.event.addListener(map,'dblclick',function(event){ 
    map.setCenter(event.latLng); 
        var marker = new google.maps.Marker({//双击的时候给个标记，并显示个信息 
              map: map,                                
              position: event.latLng,    //注意此处，获取标记的经纬度的方法 
              zIndex:1, 
              draggable:true, 
              title:'my tag' 
        }); 
        infowindow.setContent('my home'); 
        infowindow.open(map, marker); 
    }); 
    //鼠标移动 
    google.maps.event.addListener(map,'mouseover',function(){ 
        //alert("run mouseover"); 
    }); 
} 

//导航处理 
function route() { 
      // Clear any previous route boxes from the map 
      clearBoxes(); 
     
      // Convert the distance to box around the route from miles to km 
      distance = parseFloat(400) * 1.609344; 
     
      /** 
      DirectionsRequest 对象 一共有10个可配置参数 
      导航DirectionService.route方法必须的参数对象 有三个必须配置的属性：开始地点、目的地，导航类型 
      */ 
      var request = { 
        origin: document.getElementById("from").value,            //开始地点 可以为地点名或者LatLng对象 
        destination: document.getElementById("to").value,        //目的地   可以为地点名或者LatLng对象 
        provideRouteAlternatives: true,                            //是否提供替代路线 可选参数 
        travelMode: google.maps.DirectionsTravelMode.DRIVING    //导航类型 BICYCLING(自行车方式)、DRIVING(驾车)、WALKING(自定义) 
      } 
     
      /*导航方法。参数为DirectionsRequest 和一个回调函数 
          其中回调函数的参数为 
          1、DirectionsResult 只有一个属性 DirectionsRoute[]对象数组。 
              当DirectionsRequest 中的provideRouteAlternatives 设置为true 时有多个数据集，否则数组的长度为1 
          2、DirectionsStatus 
      */ 
      directionService.route(request, function(result, status) { 
        if (status == google.maps.DirectionsStatus.OK) { 
          directionsRenderer.setDirections(result);   
          alert("共有 " + result.routes.length + " 种导航方案"); 
          /*DirectionsRoute 对象    导航路线的对象 
             
          */ 
          var path = result.routes[0].overview_path; //返回 DirectionsRoute 对象 
          var boxes = routeBoxer.box(path, distance); //通过 routeBoxer对象画出路线图 
          drawBoxes(boxes); 
        } else { 
          alert("Directions query failed: " + status); 
        } 
      }); 
    } 
   
   
   
    // 描路线的方法 
    function drawBoxes(boxes) { 
      boxpolys = new Array(boxes.length); 
      for (var i = 0; i < boxes.length; i++) { 
    // alert(boxes[i]); 
    //画矩形点描出路径 
        boxpolys[i] = new google.maps.Rectangle({    //构造器的参数 RectangleOptions类型 
        /* 
            RectangleOptions:共9个可配置参数 详细见API 
               
        */ 
          bounds: boxes[i],        //LatLngBounds 对象，描点的位置 
          fillOpacity: 0,        //背景的不透明度 0为透明 
          strokeOpacity: 0.5,    //导航线的透明度 0为透明 
          strokeColor: '#000000',    //背景颜色 
          strokeWeight: 1,        //宽度 
          map: map 
        }); 
      } 
    } 
   
    // 清除路线缓存 
    function clearBoxes() { 
      if (boxpolys != null) { 
        for (var i = 0; i < boxpolys.length; i++) { 
          boxpolys[i].setMap(null); 
        } 
      } 
      boxpolys = null; 
    } 

</script> 
</head> 

<body onload="initialize()">
<center>
<div id="map_canvas" style="width: 650; height: 380; border:2px solid #CCC;" ></div> 
<div> 
    <input id="address" type="textbox" value="湖南省郴州市安仁县"> 
    <input type="button" value="查询" onclick="codeAddress()"> 
    <input type="button" value="显示中心点" onclick="codeLatLng()"> 
</div> 
<br> 
从<input id="from" type="text" value="安仁清溪镇"> 
到<input id="to" type="text" value="安仁城关镇"> 
<input type="button" value="导航" onclick="route()"> 
</center>
</body> 
</html>